package br.com.virtual.cadastrar.dao.impl;

import java.util.ArrayList;
import java.util.List;

import br.com.virtual.base.dao.impl.BaseDaoImpl;
import br.com.virtual.cadastrar.dao.CategoriaDAO;
import br.com.virtual.cadastrar.model.Categoria;
import br.com.virtual.cadastrar.model.Grupo;

public class CategoriaDAOImpl extends BaseDaoImpl implements CategoriaDAO {

	@Override
	public Categoria create(Categoria categoria) {

		getManager().persist(categoria);
		return categoria;
	}

	@Override
	public Categoria read(Long id) {
		return getManager().find(Categoria.class, id);
	}

	@Override
	public void update(Categoria categoria) {
		getManager().merge(categoria);
	}

	@Override
	public void delete(Categoria categoria) {
		getManager().remove(read(categoria.getId()));
	}

	@Override
	public List<Categoria> getList() {
		return this.list(" order by c.id desc ");
	}

	@Override
	public List<Categoria> getListAtivo() {
		return this.list(" where c.ativo = true ");
	}

	@Override
	public List<Categoria> getListSemPai() {
		return this.list(" where c.pai = null ");
	}

	private List<Categoria> list(String where) {
		return new ArrayList<Categoria>(getManager().createQuery(
				"from Categoria c " + where, Categoria.class).getResultList());
	}

	@Override
	public List<Categoria> readChildren(Long id) {
		List<Categoria> cats = new ArrayList<Categoria>(getManager()
				.createQuery(
						" Select c from Categoria c "
								+ " where c.pai.id = :cid", Categoria.class)
				.setParameter("cid", id).getResultList());

		return cats;
	}

	@Override
	public List<Categoria> getListByGrupo(Grupo grupo) {

		List<Categoria> cat;

		cat = new ArrayList<Categoria>(this
				.getManager()
				.createQuery(
						" select distinct c from Categoria c "
								+ "left join fetch c.filhos f "
								+ "where c.grupo = :grupo and c.pai is null ",
						Categoria.class).setParameter("grupo", grupo)
				.getResultList());

		return cat;

	}

}
